home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 52
/
Amiga Format AFCD52 (Issue 136, May 2000).iso
/
-serious-
/
workbench
/
fullbench-3.00
/
src
/
fullbench.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-28
|
5KB
|
200 lines
/*
**
*/
#define REVISION "3.0"
#define REVDATE "30.1.2000"
#define AUTHOR "Gunther Nikl"
#define PROGNAME "FullBench"
#define PORTNAME "FullBench.rendezvous"
/*
**
*/
#include <string.h>
#include <dos/dosextens.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/screennotify.h>
#include <proto/screennotify.h>
#include <proto/intuition.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include "compiler.h"
/*
**
*/
struct FullBenchArgs {
APTR IntBase;
struct Image *id;
struct DrawInfo *dri;
struct Gadget *gad;
struct Window *win;
};
ULONG REGARGS Full(struct FullBenchArgs *fb,LONG on);
/*
**
*/
#if defined(__GNUC__)
__asm("jra _FullBench");
STATIC APTR new_object(REG(a6,APTR IntuitionBase),REG(a0,APTR classPtr),REG(a1,char *classID),Tag tag,...)
{
return NewObjectA(classPtr,classID,(struct TagItem *)&tag);
}
#undef NewObject
#define NewObject(a,b,c...) new_object(IntuitionBase,a,b,c)
STATIC struct Window *open_window_tags(REG(a6,APTR IntuitionBase),REG(a0,struct NewWindow *newWindow),Tag tag,...)
{
return OpenWindowTagList(newWindow,(struct TagItem *)&tag);
}
#undef OpenWindowTags
#define OpenWindowTags(a,b...) open_window_tags(IntuitionBase,a,b)
#endif
/*
**
*/
LONG FullBench(VOID)
{ APTR SysBase,DOSBase,ScreenNotifyBase;
struct ScreenNotifyMessage *snm;
struct FullBenchArgs fb;
struct MsgPort *mp,*tport;
struct Process *pr;
APTR wbmsg,handle;
SysBase = *(APTR *)4L; pr = (struct Process *)FindTask(NULL);
if (wbmsg=NULL,!pr->pr_CLI)
wbmsg = (WaitPort(&pr->pr_MsgPort),GetMsg(&pr->pr_MsgPort));
Forbid();
if ((mp=FindPort(PORTNAME)) != NULL) {
Signal(mp->mp_SigTask,SIGBREAKF_CTRL_C);
}
else if ((tport=CreateMsgPort()) != NULL) {
tport->mp_Node.ln_Pri = -1;
tport->mp_Node.ln_Name = PORTNAME;
AddPort(tport);
}
Permit();
if (!mp && tport) {
if ((DOSBase=OpenLibrary("dos.library",36L)) != NULL) {
if ((fb.IntBase=OpenLibrary("intuition.library",0L)) != NULL) {
if ((ScreenNotifyBase=OpenLibrary("screennotify.library",1L))!= NULL) {
if ((handle=AddWorkbenchClient(tport,0))) {
if (Full(&fb,TRUE)) {
for(;;) {
if (Wait(SIGBREAKF_CTRL_C|(1L<<mp->mp_SigBit)) & SIGBREAKF_CTRL_C)
break;
while ((snm=(struct ScreenNotifyMessage *)GetMsg(tport))) {
if (snm->snm_Type == SCREENNOTIFY_TYPE_WORKBENCH)
Full(&fb,(LONG)snm->snm_Value);
ReplyMsg(&snm->snm_Message);
}
}
Full(&fb,FALSE);
}
while (!RemPubScreenClient(handle)) Delay(10);
}
CloseLibrary(ScreenNotifyBase);
}
CloseLibrary(fb.IntBase);
}
CloseLibrary(DOSBase);
}
RemPort(tport); DeleteMsgPort(tport);
}
if (wbmsg) {
Forbid();
ReplyMsg(wbmsg);
}
return 0;
}
/*
**
*/
ULONG REGARGS Full(struct FullBenchArgs *fb,LONG on)
{ STATIC CONST struct EasyStruct err = {
5*sizeof(ULONG),
0,
PROGNAME" "REVISION "\0$VER: "PROGNAME" "REVISION" ("REVDATE") (c) "AUTHOR,
"Can't find Worbench screen\nor WB is not backdrop",
"Continue"
};
LREG(a6,APTR IntuitionBase) = fb->IntBase;
struct Screen *wb_scr;
struct Window *wb_win;
ULONG lock,success=FALSE;
if ((wb_scr=LockPubScreen("Amiga Workbench"+6)) == NULL) {
EasyRequestArgs(NULL, &err, NULL, NULL);
}
else {
lock = LockIBase(0);
for(wb_win = wb_scr->FirstWindow; wb_win
&& (strncmp(wb_win->ScreenTitle,"Amiga Workbench",15)
#if 0
&& strncmp(wb_win->ScreenTitle,"Attempting to load program",25)
&& strncmp(wb_win->ScreenTitle,"Copyright © 1985-199",20)
&& strncmp(wb_win->ScreenTitle,"Cannot Quit yet",15)
#endif
|| wb_win->Title!=NULL); wb_win = wb_win->NextWindow);
UnlockIBase(lock);
if (!wb_win) {
EasyRequestArgs(NULL, &err, NULL, NULL);
}
else {
ShowTitle(wb_scr, !on);
if (on) {
fb->id = NewObject(NULL, SYSICLASS,
SYSIA_DrawInfo, fb->dri = GetScreenDrawInfo(wb_scr),
SYSIA_Which, SDEPTHIMAGE,
SYSIA_Size, (wb_scr->Flags & SCREENHIRES ? SYSISIZE_MEDRES : SYSISIZE_LOWRES),
IA_Height,wb_scr->BarHeight+1,
TAG_DONE);
fb->gad = NewObject(NULL, BUTTONGCLASS,
GA_Image, fb->id,
GA_SysGType, GTYP_SDEPTH,
TAG_DONE);
if ((fb->win = OpenWindowTags(NULL,
WA_Title,"win_FullBench",
WA_PubScreen, wb_scr,
WA_Top, 0,
WA_Left, 32000,
WA_Height, fb->id->Height,
WA_Width, fb->id->Width-1, /* Dunno why I need this -1 */
WA_AutoAdjust, TRUE,
WA_Gadgets, fb->gad,
WA_Flags, WFLG_BORDERLESS,
TAG_END)))
{
ChangeWindowBox(wb_win,wb_win->LeftEdge,0,wb_win->Width,wb_scr->Height);
success=TRUE;
}
} else {
ChangeWindowBox(wb_win,wb_win->LeftEdge,(wb_scr->BarHeight+1),
wb_win->Width,wb_scr->Height-(wb_scr->BarHeight+1));
CloseWindow(fb->win);
DisposeObject(fb->gad);
DisposeObject(fb->id);
FreeScreenDrawInfo(wb_scr,fb->dri);
success=TRUE;
}
}
UnlockPubScreen(NULL, wb_scr);
}
return success;
}